﻿/*-------------------------------------------------------------------------
* 命名空间: ScreenCapture.Common/CmdOptions
* 类       名: CmdOptions
* 功      能:  TD
* 时      间:  2023/12/5 17:28:29
* 版      本:  V1.0
* 作      者:  Fioman
* 格      言:  Talk is cheap,show me the code ^_^
*-------------------------------------------------------------------------*/

using CommandLine;
using System.Threading;

namespace ScreenCapture.Common
{
    /// <summary>
    /// Command-line Options for the WPF app
    /// [Option] 特性用于告诉命令解析器比如(CommandLineParser库),这个属性是要解析的属性选项.
    /// 首先,你通过类属性上添加[Option]特性来定义可接受的命令行参数.然后,当你的程序运行的时候,命令行解析器会查看
    /// 传入的命令行参数,并尝试将它们匹配到你顶一顶额选项上.
    /// 例如,我们定义一个reset选项.如果在命令行中包含--reset参数,计息期就会降CmdOptions类中的Reset属性设置为true.
    /// [Option]特性是用来给命令解析器(比如CommandLine.Parser)标记和识别哪些属性需要从命令行参数中解析出来的.
    /// 当你调用CommandLine.Parser的ParseArguments方法时，它会遍历CmdOptions类的所有属性，查找被[Option]特性标记的属性。然后，
    /// 它会尝试从传入的命什么行参数中解析出这些属性的值。
    /// 如果在命令行参数中找到了匹配的参数（也就是说，参数的名称与[Option] 特性中定义的名称匹配），
    /// 解析器就会将该参数的值（如果有的话）赋给对应的属性。所以说，[Option] 特性是用来告诉命令行解析器如何从命令行参数中解析属性值的。
    /// </summary>
    public class CmdOptions
    {
        /// <summary>
        /// --reset 命令是否存在,存在Reset属性就为true,否在为false
        /// </summary>
        [Option("reset", HelpText = "Reset all setting values to default.")]
        public bool Reset { get; set; }

        /// <summary>
        /// --tray 命令是否存在,存在Tray属性就设置为true,否则就设置为false
        /// </summary>
        [Option("tray", HelpText = "Start minimized into the system tray.")]
        public bool Tray { get; set; }

        /// <summary>
        /// --no-hotkey 命令是否存在,存在no-hotkey属性就设置为true,否则就设置为false
        /// </summary>
        [Option("no-hotkey", HelpText = "Do not Register hotkeys.")]
        public bool NoHotkeys { get; set; }

        /// <summary>
        /// --no-persist 命令是否存在,存在NoPersist属性就设置为true,否在就设置为false
        /// </summary>
        [Option("no-persist", HelpText = "Do not save any changes in settings.")]
        public bool NoPersist { get; set; }

        /// <summary>
        /// --settings somevalue 如果返回值是字符串,表示希望在命令行参数中看到类似这种
        /// --settings somevalue 这种形式,期望得到一个字符串.
        /// </summary>
        [Option("settings", HelpText = "Settings Directory")]
        public string? Settings { get; set; }

    }
}
